        # qemu -kernel loads the kernel at 0x80000000
        # and causes each hart (i.e. CPU) to jump there.
        # kernel.ld causes the following code to
        # be placed at 0x80000000.
.section .text # 这行指示器告诉汇编器将下面的指令放在程序的文本段（通常是存放代码的段）中
.global _entry # 这行指示器声明_entry符号是全局可见的，其他模块可以引用它。
_entry: # 程序的入口点
        # set up a stack for C.
        # stack0 is declared in start.c,
        # with a 4096-byte stack per CPU.
        # sp = stack0 + (hartid * 4096)
        la sp, stack0 # (Load Address)将stack0的地址加载到寄存器sp中，sp是堆栈指针寄存器，用于指向当前栈顶
        li a0, 1024*4 # (Load Immediate)将立即数1024*4（即4096）加载到寄存器a0中，作为每个CPU的栈大小。
        csrr a1, mhartid # 使用csrr指令将mhartid（Machine Hart ID）寄存器的值加载到寄存器a1中，mhartid寄存器存储当前CPU核的ID。
        addi a1, a1, 1 # 将寄存器a1中的值加1，这样a1存储的就是当前CPU的ID加1的值。
        mul a0, a0, a1 # 将寄存器a0中的值（栈大小）乘以寄存器a1中的值（CPU ID + 1），结果存储回a0中，以计算出当前CPU的栈在stack0上的偏移量。
        add sp, sp, a0 # 将栈指针sp的值增加a0，这样sp指向了当前CPU的栈顶。
        # jump to start() in start.c 
        call start # 调用start函数，开始执行C代码部分。
spin:
        j spin # 无限循环，保持CPU处于忙等待状态。这样做是因为一旦操作系统初始化完毕，就需要CPU不停地执行一些任务，而不是终止执行。
